package br.com.naybee.framework.client.utils;

public class NumberUtils {

	/**
	 * Converte uma {@linkplain String} para um <code>int</code>, retorna um valor default se a conversão falhar
	 * 
	 * <p>
	 * Se a {@linkplain String} for <code>null</code>, então retorna o valor default.
	 * </p>
	 * 
	 * <pre>
	 *   NumberUtils.toInt(null, 1) = 1
	 *   NumberUtils.toInt("", 1)   = 1
	 *   NumberUtils.toInt("1", 0)  = 1
	 * </pre>
	 * 
	 * @param str
	 *            string que será convertida
	 * @param defaultValue
	 *            valor default
	 * @return o int representada pela string, ou o default se a conversão falhar
	 */
	public static int toInt(String str, int defaultValue) {
		if (str == null) {
			return defaultValue;
		}
		try {
			return Integer.parseInt(str);
		} catch (NumberFormatException nfe) {
			return defaultValue;
		}
	}

	/**
	 * Converte uma {@linkplain String} para um <code>int</code>, ou o {@code 0 <b>zero</b>} se a conversão falhar
	 * 
	 * <pre>
	 *   NumberUtils.toInt(null) = 0
	 *   NumberUtils.toInt("")   = 0
	 *   NumberUtils.toInt("1")  = 1
	 * </pre>
	 * 
	 * @param str
	 *            string que será convertida
	 * @return o int representada pela string, ou o {@code 0 <b>zero</b>} se a conversão falhar
	 */
	public static int toInt(String str) {
		return toInt(str, 0);
	}

	/**
	 * Converte uma {@linkplain String} para um <code>long</code>, retorna um valor default se a conversão falhar
	 * 
	 * <p>
	 * Se a {@linkplain String} for <code>null</code>, então retorna o valor default.
	 * </p>
	 * 
	 * <pre>
	 *   NumberUtils.toLong(null, 1) = 1
	 *   NumberUtils.toLong("", 1)   = 1
	 *   NumberUtils.toLong("1", 0)  = 1
	 * </pre>
	 * 
	 * @param str
	 *            string que será convertida
	 * @param defaultValue
	 *            valor default
	 * @return o long representada pela string, ou o default se a conversão falhar
	 */
	public static long toLong(String str, int defaultValue) {
		if (str == null) {
			return defaultValue;
		}
		try {
			return Long.parseLong(str);
		} catch (NumberFormatException nfe) {
			return defaultValue;
		}
	}

	/**
	 * Convert a String para an <code>long</code>, retornando 0 se a conversão falhar
	 * 
	 * <pre>
	 *   NumberUtils.toLong(null) = 0
	 *   NumberUtils.toLong("")   = 0
	 *   NumberUtils.toLong("1")  = 1
	 * </pre>
	 * 
	 * @param str
	 *            string que será convertida
	 * @return o long representada pela string, ou o 0 zero se a conversão falhar
	 */
	public static long toLong(String str) {
		return toLong(str, 0);
	}

	/**
	 * Converte uma {@linkplain String} para um <code>double</code>, retorna um valor default se a conversão falhar
	 * 
	 * <p>
	 * Se a {@linkplain String} for <code>null</code>, então retorna o valor default.
	 * </p>
	 * 
	 * <pre>
	 *   NumberUtils.toDouble(null) = 0.0
	 *   NumberUtils.toDouble("")   = 0.0
	 *   NumberUtils.toDouble("1")  = 1.0
	 * </pre>
	 * 
	 * @param str
	 *            string que será convertida
	 * @param defaultValue
	 *            valor default
	 * @return o long representada pela string, ou o default se a conversão falhar
	 */
	public static double toDouble(String str, int defaultValue) {
		if (str == null) {
			return defaultValue;
		}
		try {
			return Double.parseDouble(str);
		} catch (NumberFormatException nfe) {
			return defaultValue;
		}
	}

	/**
	 * Convert a String para an <code>double</code>, retornando 0 se a conversão falhar
	 * 
	 * <pre>
	 *   NumberUtils.toDouble(null) = 0.0
	 *   NumberUtils.toDouble("")   = 0.0
	 *   NumberUtils.toDouble("1")  = 1.0
	 * </pre>
	 * 
	 * @param str
	 *            string que será convertida
	 * @return o double representada pela string, ou o 0 zero se a conversão falhar
	 */
	public static double toDouble(String str) {
		return toDouble(str, 0);
	}

}
